import vnode from './vnode.js'

//编写一个低配版本的h函数，这个函数必须接受3个参数，缺一不可
//相当于它的重载功能较弱

// 1, h('div',{},'文字')
// 2, h('div',{},[])
// 3, h('div',{},h())

//调用的时候必须是上面的三种之一

export default function (sel, data, c) {
  //检查参数的个数
  if (arguments.length != 3) {
    throw new Error('对不起，h函数必须传入三个参数，我们是低配版h函数')
  }
  if (typeof c == 'string' || typeof c == 'number') {
    //说明现在调用h函数是形态1
    return vnode(sel, data, undefined, c, undefined)
  } else if (Array.isArray(c)) {
    let children = []
    //说明现在调用h函数是形态2
    //遍历c
    for (let i = 0; i < c.length; i++) {
      //检查c[i]必须是一个对象,如果不满足
      if (!(typeof c[i] == 'object' && c[i].sel)) {
        throw new Error('传入的数组参数中有项不是h函数')
      }
      children.push(c[i])
    }
    //循环结束了，就说明children收集完毕了，此时可以返回虚拟节点了，它有children属性的
    return vnode(sel, data, children, undefined, undefined)
  } else if (typeof c == 'object' && c.hansOwnProperty('sel')) {
    //说明现在调用h函数是形态3
    let children = [c]
    return vnode(sel, data, children, undefined, undefined)
  } else {
    throw new Error('传入的第三个参数类型不对')
  }
}
